/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.entidades;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author ariel
 */
@Entity
@Table(name = "PROFESIONALES", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"nombreUsuario"}), // coma: separador entre constraints
    @UniqueConstraint(columnNames = {"numeroDocumento", "tipoDocumento_id"}),
    @UniqueConstraint(columnNames = {"mail"})
})
public class Profesional implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "nombreUsuario", nullable = false)
    private String nombreUsuario;

    @Column(name = "contrasenia", nullable = false)
    private String contrasenia;

    @Column(name = "rol", nullable = false)
    private Integer rol;
    
    @Column(name = "nombre", nullable = false)
    private String nombre;
    
    @Column(name = "apellido", nullable = false)
    private String apellido;
    
    @Column(name = "telefono", nullable = false)
    private String telefono;
    
    @Column(name = "mail", nullable = false)
    private String mail;
    
    @Column(name = "numeroDocumento", nullable = false)
    private String numeroDocumento;
    
    @ManyToOne
    @JoinColumn(name = "tipoDocumento_id", nullable = false)
    private TipoDocumento tipoDocumento;
    
    @OneToOne
    @JoinColumn(name = "bajaLogica_id", nullable = true)
    private BajaLogicaProfesional bajaLogicaProfesional;
    
    @ManyToOne
    @JoinColumn(name = "sexo_id", nullable = false)
    private Sexo sexo;
    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "PROFESIONALES_ESPECIALIDADES",
            joinColumns = {
                @JoinColumn(name = "PROFESIONAL_ID", referencedColumnName = "id")},
            inverseJoinColumns = {
                @JoinColumn(name = "ESPECIALIDAD_ID", referencedColumnName = "id")}
    )
    private List<Especialidad> especialidades;

    public Profesional() {}

    // getter de estado
    public String getEstado() {
        if (bajaLogicaProfesional == null) {
            return "ACTIVO";
        }
        return "INACTIVO";
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public String getContrasenia() {
        return contrasenia;
    }

    public void setContrasenia(String contrasenia) {
        this.contrasenia = contrasenia;
    }

    public Integer getRol() {
        return rol;
    }

    public void setRol(Integer rol) {
        this.rol = rol;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public BajaLogicaProfesional getBajaLogicaProfesional() {
        return bajaLogicaProfesional;
    }

    public void setBajaLogicaProfesional(BajaLogicaProfesional bajaLogicaProfesional) {
        this.bajaLogicaProfesional = bajaLogicaProfesional;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public List<Especialidad> getEspecialidades() {
        return especialidades;
    }

    public void setEspecialidades(List<Especialidad> especialidades) {
        this.especialidades = especialidades;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Profesional other = (Profesional) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Cambiar toString de Profesional, si es necesario";
    }
    
}
